%% PDE Example: Diffusion in a box (Same as heat)
% We look the time-evolution of the distribution of small particles as they
% spread due to diffusion, but are confined to a 1D box. The box has length
% L. 
%
% The Diffusion equation is:
%%
% $$\frac{\partial u}{\partial t}=D\frac{\partial^2 u}{\partial x^2}$$
%
%
% Boundary conditions for the closed box case are:
%
% $$\frac{\partial u}{\partial x}(0,t)=0$$,
% $$\frac{\partial u}{\partial x}(L,t)=0$$
%
% We can see that the following is a solution to the differential equation:
%
% $$u(x,t)=A_n e^{-\frac{n^2 D \pi^2}{L^2}t}\cos{\frac{n \pi x}{L}} $$
%
% where $A_n$ are determined by the intial distribution $u(x,0)$.

%Setup problem and initial state
L=100;          %Length of box
D=1;            %Diffusion Constant
U0=zeros(1,L);  %This is our t=0 particle distribution u(x,0)
U0(50)=1;       %Make this a delta function (we dropped a small drop of ink into the middle of 1D glass of water)

X=(0:L-1);
N=length(X)

%Calculate the Coefficients 
A0=1/L*sum(U0);
for nn=1:N-1
    An(nn)=2/L*sum(U0.*cos(nn*pi*X/L));
end
An(N)=1/L*sum(U0.*cos(N*pi*X/L));
%Note the special end cases.  This correction is required to to exactly represent the U0 using an
%orthognal set of cosine base functions. The term An(N) is different in the
%discrete sampling case. 

% Calculates a term in the series sum. 
DiffEq = @(A,t,n,x)A*exp(-(n^2*D*pi^2*t/L^2))*cos(n*pi*x/L);

%Show the series sum to represent U0
X=(0:L-1);
t=0;
U=A0;
figure
for nn=1:N
    Wave=DiffEq(An(nn),t,nn,X);
    U=U+DiffEq(An(nn),t,nn,X);
    subplot(2,1,1);
    plot(X,Wave)
    xlabel('X');ylabel('Wave')
    subplot(2,1,2);
    hold off
    plot(X,U)
    hold on;
    plot(X,U0,'r--');
    xlabel('X');ylabel('U')
    %pause(.01)
end
legend('Fourier Sum','U0')

%% Show the time evolution:
% We simply evaluate the series at different time points. 

figure
for tt=0:.1:10
    U=A0;
    for nn=1:N
        U=U+DiffEq(An(nn),tt,nn,X);
    end
    plot(X,U) 
    xlabel('X');ylabel('U(x,t)')
    s=sprintf('time: %g',tt);
    text(80,.5,s);
    axis([0 L 0 1])
    %pause(1)
end














